package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Spring 家族持久层命名规范为repository
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    // 当前ItemRepository接口可以继承SpringDataElasticsearch框架提供的父接口ElasticsearchRepository
    // 一旦继承,效果是会为指定的实体类自动生成基本的增删改查方法
    // ElasticsearchRepository<[关联的实体类名],[实体类主键类型]>

    // SpringData自定义查询
    // 遵循SpringData框架给定的格式,编写方法名称,就可以自动生成查询语句
    // query(查询): 表示当前方法是一个查询方法,类似sql中的select
    // Item\Items: 表示要查询的实体类,不带s返回单个对象,带s返回集合类型
    // By(通过): 标识开始设置条件的关键词,类似sql中的where
    // Title: 要查询的字段名称
    // Matches: 执行的查询操作,Matches表示执行查询支持分词的字符串 类似sql中的like

    Iterable<Item> queryItemsByTitleMatches(String title);

    // 多条件查询
    // 多个条件之间需要使用逻辑运算符And或Or来分割
    // 方法参数赋值的依据是根据方法名称中参数的顺序来决定的

    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);

    // 排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
                                                            String title,String brand);


    // 分页查询
    // 实现分页查询:最后一个参数的位置添加声明类型Pageable的变量
    // 返回值修改为Page类型,这个类型的对象不但能够保存查询出的数据,而且还能自动计算出分页信息
    // 分页信息中包括:当前页,总页数,总条数,是否有上一页或下一页等
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);



}
